const http = require("http"); // 引入 http 模块，用于创建 HTTP 服务器
const fs = require("fs"); // 引入 fs 模块，用于文件系统操作
const path = require("path"); // 引入 path 模块，用于处理文件路径
const qs = require("querystring"); // 引入 querystring 模块，用于解析查询字符串
const data = require("../data.json"); // 引入数据文件，包含个性化内容

const server = http.createServer((req, res) => { // 创建 HTTP 服务器
  // 起始页路由处理
  if (req.url === "/") { // 检查请求的 URL 是否为根路径
    // 读取 index.html 内容
    const indexPage = fs.readFileSync(path.join(__dirname, "../index.html"), { // 同步读取 index.html 文件
      encoding: "utf8", // 指定编码格式为 utf8
    });

    // 将读取的 index.html 内容写入响应中，并返回给前端展示
    res.writeHead(200, { "Content-Type": "text/html" }); // 设置响应头，状态码为 200，内容类型为 HTML
    res.write(indexPage); // 将 index.html 内容写入响应
    res.end(); // 结束响应
  }
  // 个性化页面路由处理
  else if (req.url.startsWith("/customized")) { // 检查请求的 URL 是否以 /customized 开头
    let body = ""; // 初始化请求体
    req.on("data", (chunk) => { // 监听数据事件
      body += chunk; // 将接收到的数据块拼接到 body 中
    });

    req.on("end", () => { // 监听结束事件
      let { interested = [] } = qs.parse(body); // 解析请求体，获取感兴趣的标签
      // TODO: 补充个性化页面处理代码
      interested = Array.isArray(interested) ? interested : [interested]; // 确保 interested 是数组
      let html = ""; // 初始化 HTML 内容
      if (interested.length) { // 如果有感兴趣的标签
        let set = new Set(interested); // 创建一个集合以去重
        const map = data.reduce( // 将数据转换为标签映射
          (res, item) => ((res[item.tag] = item), res), // 将每个项目的标签作为键
          {}
        );
        for (const item of interested) { // 遍历感兴趣的标签
          set = new Set([...set, ...map[item].relevance]); // 将相关标签添加到集合中
        }
        interested = Array.from(set).map((item) => map[item]); // 将集合转换为数组并映射到项目
        interested.forEach((item) => { // 遍历每个项目
          html += `
          <div class="interest"> // 创建兴趣标签的 HTML 结构
            <div class="tag">${item.tag}</div> // 显示标签
            <div>${item.content}</div> // 显示内容
          </div>
          `;
        });
      } else { // 如果没有选择任何标签
        html = `<div class="unselect">你还未选择任何感兴趣的标签！</div>`; // 显示未选择标签的提示
      }

      let customizedPage = fs.readFileSync( // 读取 customized.html 文件
        path.join(__dirname, "../customized.html"),
        "utf-8" // 指定编码格式为 utf8
      );
      customizedPage = customizedPage.replace( // 替换 HTML 中的 <body></body> 部分
        "<body></body>",
        `<body>${html}</body>` // 将生成的 HTML 内容插入到 body 中
      );
      res.writeHead(200, { "Content-Type": "text/html" }); // 设置响应头
      res.write(customizedPage); // 将个性化页面内容写入响应
      res.end(); // 结束响应
    });
  }
});

server.listen(8080, () => { // 启动服务器，监听 8080 端口
  console.log("server is running in port 8080"); // 输出服务器运行信息
});